/* --------------------------- (C) COPYRIGHT 2020 Fortiortech ShenZhen -----------------------------
    File Name      : AddFunction.h
    Author         : Fortiortech  Appliction Team
    Version        : V1.0
    Date           : 2021-11-07
    Description    : This file contains all the common data types used for Motor Control.
----------------------------------------------------------------------------------------------------
                                       All Rights Reserved
------------------------------------------------------------------------------------------------- */
/* Define to prevent recursive inclusion -------------------------------------*/

#ifndef __AddFunction_H_
#define __AddFunction_H_

/******************************************************************************/
#include <FU68xx_6.h>
/******************************************************************************/

/* Exported types ------------------------------------------------------------*/

typedef struct
{
    uint32 Times;   // 启停次数
    uint16 TimeCnt; // 运行时间计数
    uint8 State;    // 启停状态
} debugONOFFTypeDef;

typedef struct
{
    uint16 LedCount;  // 闪灯周期计数
    uint16 Counttime; // 闪灯周期
    uint16 Count;     // 电平翻转计数
    uint8 LedTimCot;  // 闪灯次数计数
} MCLedDisplay;

typedef struct
{
    int16 ubus_filtered; // 母线电压
    int16 angle_com;
    // int16  NTCTempFlt;                                                          // NTC电压值
    int16 power;          // 实时功率
    int16 power_filtered; // 功率滤波后的值
    int16 speed_filtered; // 当前速度滤波后的值
    int16 pre_speed_filtered;
    int16 uq_filtered; // Q轴电压
    int16 ud_filtered; // D轴电压
    int16 iq_filtered; // FOC_IQ 实际值
    int16 id_filtered; // FOC_ID 实际值

    /* 预定位 */
    int16 ud_align_ref;
    int16 ud_align;
    int16 ud_align_flag;
    int16 id_align_sample;
    int16 id_align_sample_pre;
    int16 id_align_sample_error;
    int16 align_theta_acc;
    int16 align_angle; // 预定位角度
    int16 align_angle_temp;
    int16 align_count;

    /* 预充电 */
    uint8 pre_charge_step; // 预充电的步骤
    uint8 start_mode;      // 启动方式
    uint8 control_mode;    // 控制模式

    int16 max_ia;
    int16 max_ib;
    int16 max_ic;

    uint8 fr;
    uint8 ato_ramp_end_flag;

    /* 目标给定 */
    int16 ref;    // 控制目标给定
    int16 iq_ref; // Q轴给定电流
    int16 id_ref; // D轴给定电流

    uint8 mode_0_hold_count; // MODE0 切 MODE1延迟时间计数
    uint16 es_value;         // 当前FOC_ESQU滤波后的值

    uint16 run_state_count; // 运行状态计数
    uint16 loop_time;       // 外环控制周期计数

    uint16 motor_state_count;   // 电机各个状态的时间计数
    int16 position_check_angle; // 位置检测的角度

    uint8 mcu_temperature; // MCU超过70°后，读取当前温度值
    int16 mdu_temperature;
    uint8 sleep_flag;

    int16 foc_iqref; // FOC_IQREF 实际值

} foc_ctrl_t;

/**
 * @brief   电机爬坡结构体
 */
typedef struct
{
    int16 ref_value;
    float out_value_float;
    float increase_value;
    float decrease_value;
} motor_ctrl_ramp_t;

typedef struct
{
    uint16 Compare; // 比较值
    uint16 Period;  // 周期值

    uint16 TimerDR;
    uint16 TimerDROld;
    uint16 TimerARR;    // 周期值
    uint16 TimerARROld; // 周期值

    uint16 Duty; // PWM占空比，Q15格式
    uint16 Freq; // PWM频率

    uint8 isUpdate; // PWM新的duty更新

} PWMINPUTCAL;

/* Exported variables ---------------------------------------------------------------------------*/

extern bool data isCtrlPowOn;
extern debugONOFFTypeDef xdata debug_ONOFFTest;
extern foc_ctrl_t xdata foc_control;
extern PWMINPUTCAL xdata mcPwmInput;
extern motor_ctrl_ramp_t xdata mcRefRamp;

/* Exported functions ---------------------------------------------------------------------------*/

extern void VariablesPreInit(void);

extern void TargetRef_Process(void);
extern void speed_response(void);
extern int16 Motor_Ramp(int16 ref);

extern void VSPSample(void);
extern void ONOFF_Starttest(void);
extern void ATORamp(void);

extern void TickCycle_1ms(void);

extern void PWMInputCapture(void);
extern void FGOutput(void);

extern uint32 Abs_F32(int32 value);

/******* Sleep控制**************/
extern void SleepMode_Init(void);
extern void SleepMode(void);

/******* **********************/
#endif